package com.eugenema.demand.impl;

import com.eugenema.demand.Demand;
import com.eugenema.entity.FutureMatch;
import com.eugenema.util.Annotation.DemandBean;
import com.eugenema.util.DemandUtil.LeagueMatchUtil;
import com.eugenema.util.SeleniumUtil;
import org.openqa.selenium.WebElement;

import java.util.ArrayList;
import java.util.List;
/**
 * <p>标题：F5 赛程</p>
 * <p>
 * 功能：获取指定联赛所有球队最近连续 3 场以上的单双数数据
 * </p>
 * <p>其他说明：存入全局存储中的 key 为方法名，即 demandOne</p>
 * <p>作者：马寅广</p>
 * <p>审核：</p>
 * <p>重构：</p>
 * <p>创建日期：2023/12/31 12:03</p>
 */
@DemandBean(key = DemandF5Schedule.DEMAND_ONE_PARAMETER_KEY, title = "F5 赛程", notice = "获取指定联赛所有球队最近连续 3 场以上的单双数数据", order = 0)
public class DemandF5Schedule extends Demand {
    /** 需求一要抓数的指定联赛 key */
    public static final String DEMAND_ONE_PARAMETER_KEY = "league_one";

    /**
     * 初始化按钮
     *
     * @author 马寅广
     *
     * @date 2023/12/31 19:18
     *
     **/
    @Override
    public void initButton() {
        createEditParameterButton();
        createOpenFileButton("F5赛程.xlsx");
    }

    /**
     * 执行需求
     * <br/> 获取指定联赛所有球队最近连续 3 场以上的单双数数据
     *
     * @author 马寅广
     * @date 2023/12/31 12:55
     *
     *
     * @return 执行结果
     **/
    @Override
    public boolean execute() {
        /** 需求一映射后的实体列表 */
        List<FutureMatch> futureMatchList = new ArrayList<>();
        // 进入指定联赛界面，并遍历所有球队
        try {
            LeagueMatchUtil.leagueToTeam(RunSeleniumService(), DEMAND_ONE_PARAMETER_KEY, (leagueName) -> {
                    },
                    (sinOrDouList, teamEntry) -> {
                        /** 单双数量 */
                        int sinOrDou = 1;
                        for (int j = 0; j < sinOrDouList.size() - 1; j++) {
                            if (sinOrDouList.get(j).equals(sinOrDouList.get(j + 1))) {
                                sinOrDou++;
                            } else {
                                break;
                            }
                        }
                        // 若连场单 / 双数量 ≥ 3，则获取该球队未来最近一次比赛数据
                        if (sinOrDou >= 3) {
                            RunSeleniumService().runStep("step_6");
                            List<WebElement> futureMatchTrList = (List<WebElement>) SeleniumUtil.globalMap.get("step_6");

                            if (futureMatchTrList.isEmpty()) {
                                Logger().info("【{}】球队获取未来比赛为空，已跳过", teamEntry.getKey());
                                return;
                            }

                            //将未来最近一次比赛数据映射成实体类
                            LeagueMatchUtil.entityMap(futureMatchTrList.subList(0, 1), teamEntry.getKey(), teamEntry.getValue(), sinOrDouList.get(0), sinOrDou, futureMatchList);
                        }
                    }, (leagueName) -> {
                    }
            );
        } catch (Exception e) {
            Logger().error("执行异常：", e);
            if (futureMatchList.isEmpty()) {
                Logger().error("处理数据为空，本次将不导出数据！");
                return false;
            } else {
                Logger().error("正在将已处理数据导出……");
            }
        }

        //将处理好的数据存入全局存储 map（Selenium.globalMap）
        SeleniumUtil.globalMap.put("demandOne", futureMatchList);

        //将获取到的所有球队的未来最近一次比赛数据输出至 Excel
        RunSeleniumService().runStep("step_7");
        return true;
    }
}
